package exo4;

public final class Ouvrage {

	private static final String NL = "\n";
	private final String titre;
	private final int annee;
	private Media media;
	private boolean disponible;
	private boolean reserve;
	private Abonne emprunteur;

	public Ouvrage(String titre, Media media, int annee) {
		this.titre = titre;
		this.annee = annee;
		this.media = media;
		this.disponible = true;
		this.reserve = false;
		this.emprunteur = null;
	}

	public void setEmprunteur(Abonne emprunteur) {
		if (this.emprunteur == null && this.disponible) {
			this.emprunteur = emprunteur;
			this.disponible = false;
			this.unsetReserve();
		}
	}

	public void setRetour() {
		if (this.emprunteur != null && !this.disponible) {
			this.emprunteur = null;
			this.disponible = true;
		}
	}

	public Abonne getEmprunteur() {
		return this.emprunteur;
	}

	public boolean isReserve() {
		return this.reserve;
	}

	public boolean setReserve() {
		boolean resultat = false;
		if (!isReserve() && isDisponible()) {
			this.reserve = true;
			resultat = true;
		}
		return resultat;
	}

	public void unsetReserve() {
		this.reserve = false;
	}

	public boolean isDisponible() {
		return this.disponible;
	}

	public String getTitre() {
		return this.titre;
	}

	public int getAnnee() {
		return this.annee;
	}

	public Media getMedia() {
		return this.media;
	}

	public void setMedia(Media media) {
		this.media = media;
	}

	@Override
	public String toString() {
		StringBuffer ouvrageData = new StringBuffer();
		ouvrageData.append("\n======= Ouvrage =======").append(NL)
				.append("Titre : ").append(this.titre).append(NL)
				.append("Annee : ").append(this.annee).append(NL)
				.append("Media : ").append(this.media).append(NL);
		if (!this.disponible)
			ouvrageData.append("Emprunté par : ")
					.append(this.emprunteur.getNom()).append(NL);
		else if (this.reserve)
			ouvrageData.append("Réservé.").append(NL);
		else
			ouvrageData.append("Disponible et non réservé.").append(NL);
		return ouvrageData.toString();
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + annee;
		result = prime * result + ((media == null) ? 0 : media.hashCode());
		result = prime * result + ((titre == null) ? 0 : titre.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Ouvrage other = (Ouvrage) obj;
		if (annee != other.annee)
			return false;
		if (media != other.media)
			return false;
		if (titre == null) {
			if (other.titre != null)
				return false;
		} else if (!titre.equals(other.titre))
			return false;
		return true;
	}
}
